#!/usr/bin/env python3
"""
多样本位置检验 MCP 服务器使用示例
"""

import json
import numpy as np
from server import MultiSampleExactTests

def example_kruskal_wallis():
    """Kruskal-Wallis检验示例"""
    print("\n" + "="*50)
    print("Kruskal-Wallis 秩和检验示例")
    print("="*50)
    
    # 示例：比较三种不同教学方法的效果
    print("\n场景：比较三种教学方法对学生成绩的影响")
    print("数据：学生考试成绩（0-100分）")
    
    method_a = [75, 82, 78, 85, 80]  # 传统教学法
    method_b = [88, 92, 85, 90, 87]  # 多媒体教学法
    method_c = [79, 83, 81, 86, 84]  # 混合教学法
    
    print(f"传统教学法成绩: {method_a}")
    print(f"多媒体教学法成绩: {method_b}")
    print(f"混合教学法成绩: {method_c}")
    
    data_groups = [method_a, method_b, method_c]
    
    result = MultiSampleExactTests.kruskal_wallis_exact(data_groups, alpha=0.05)
    
    print("\n检验结果:")
    print(f"H统计量: {result['statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"效应量(η²): {result['eta_squared']:.4f}")
    print(f"结论: {result['conclusion']}")

def example_jonckheere_terpstra():
    """Jonckheere-Terpstra检验示例"""
    print("\n" + "="*50)
    print("Jonckheere-Terpstra 趋势检验示例")
    print("="*50)
    
    # 示例：检验不同剂量药物的疗效趋势
    print("\n场景：检验不同剂量药物的疗效是否呈递增趋势")
    print("数据：疗效评分（1-10分，分数越高疗效越好）")
    
    low_dose = [3, 4, 2, 5, 3]      # 低剂量组
    medium_dose = [5, 6, 4, 7, 5]   # 中剂量组
    high_dose = [7, 8, 6, 9, 8]     # 高剂量组
    
    print(f"低剂量组疗效: {low_dose}")
    print(f"中剂量组疗效: {medium_dose}")
    print(f"高剂量组疗效: {high_dose}")
    
    data_groups = [low_dose, medium_dose, high_dose]
    
    result = MultiSampleExactTests.jonckheere_terpstra_exact(data_groups, alpha=0.05)
    
    print("\n检验结果:")
    print(f"J统计量: {result['J_statistic']:.4f}")
    print(f"标准化统计量: {result['z_statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"结论: {result['conclusion']}")

def example_friedman():
    """Friedman检验示例"""
    print("\n" + "="*50)
    print("Friedman 秩和检验示例")
    print("="*50)
    
    # 示例：比较三种运动方式对减重效果的影响（配对设计）
    print("\n场景：比较三种运动方式对减重效果的影响（同一批受试者）")
    print("数据：减重公斤数")
    
    # 每行代表一个受试者，每列代表一种运动方式
    data_matrix = [
        [2.1, 3.5, 2.8],  # 受试者1
        [1.8, 4.2, 3.1],  # 受试者2
        [2.5, 3.8, 2.9],  # 受试者3
        [1.9, 4.0, 3.2],  # 受试者4
        [2.3, 3.7, 3.0]   # 受试者5
    ]
    
    print("减重效果数据（行=受试者，列=运动方式）:")
    print("受试者\t跑步\t游泳\t骑车")
    for i, row in enumerate(data_matrix, 1):
        print(f"受试者{i}\t{row[0]}\t{row[1]}\t{row[2]}")
    
    result = MultiSampleExactTests.friedman_exact(data_matrix, alpha=0.05)
    
    print("\n检验结果:")
    print(f"χ²统计量: {result['statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"Kendall's W: {result['kendalls_w']:.4f}")
    print(f"结论: {result['conclusion']}")

def example_kendall_concordance():
    """Kendall协同系数检验示例"""
    print("\n" + "="*50)
    print("Kendall 协同系数检验示例")
    print("="*50)
    
    # 示例：三位评委对五个作品的评分一致性
    print("\n场景：检验三位评委对五个艺术作品评分的一致性")
    print("数据：评分（1-10分）")
    
    # 每行代表一个作品，每列代表一位评委
    data_matrix = [
        [8, 7, 8],  # 作品1
        [6, 5, 6],  # 作品2
        [9, 8, 9],  # 作品3
        [7, 6, 7],  # 作品4
        [5, 4, 5]   # 作品5
    ]
    
    print("评分数据（行=作品，列=评委）:")
    print("作品\t评委1\t评委2\t评委3")
    for i, row in enumerate(data_matrix, 1):
        print(f"作品{i}\t{row[0]}\t{row[1]}\t{row[2]}")
    
    result = MultiSampleExactTests.kendall_coefficient_concordance(data_matrix, alpha=0.05)
    
    print("\n检验结果:")
    print(f"Kendall's W: {result['kendalls_w']:.4f}")
    print(f"χ²统计量: {result['chi2_statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"一致性水平: {result['consistency_level']}")
    print(f"结论: {result['conclusion']}")

def example_cochran_q():
    """Cochran Q检验示例"""
    print("\n" + "="*50)
    print("Cochran Q 检验示例")
    print("="*50)
    
    # 示例：比较三种治疗方法的治愈率
    print("\n场景：比较三种治疗方法的治愈率（同一批患者）")
    print("数据：治愈情况（1=治愈，0=未治愈）")
    
    # 每行代表一个患者，每列代表一种治疗方法
    data_matrix = [
        [1, 1, 0],  # 患者1
        [0, 1, 1],  # 患者2
        [1, 1, 1],  # 患者3
        [0, 0, 1],  # 患者4
        [1, 0, 0],  # 患者5
        [1, 1, 1],  # 患者6
    ]
    
    print("治愈情况数据（行=患者，列=治疗方法）:")
    print("患者\t方法A\t方法B\t方法C")
    for i, row in enumerate(data_matrix, 1):
        print(f"患者{i}\t{row[0]}\t{row[1]}\t{row[2]}")
    
    result = MultiSampleExactTests.cochran_q_test(data_matrix, alpha=0.05)
    
    print("\n检验结果:")
    print(f"Q统计量: {result['Q_statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"各方法治愈率: {[f'{rate:.2%}' for rate in result['treatment_success_rates']]}")
    print(f"结论: {result['conclusion']}")

def example_page_test():
    """Page检验示例"""
    print("\n" + "="*50)
    print("Page 趋势检验示例")
    print("="*50)
    
    # 示例：检验不同时间点的疼痛评分是否呈下降趋势
    print("\n场景：检验治疗后不同时间点的疼痛评分是否呈下降趋势")
    print("数据：疼痛评分（1-10分，分数越高疼痛越严重）")
    
    # 每行代表一个患者，每列代表一个时间点（治疗前、治疗后1周、治疗后2周）
    data_matrix = [
        [8, 5, 3],  # 患者1
        [7, 4, 2],  # 患者2
        [9, 6, 4],  # 患者3
        [6, 3, 1],  # 患者4
        [8, 5, 2]   # 患者5
    ]
    
    print("疼痛评分数据（行=患者，列=时间点）:")
    print("患者\t治疗前\t1周后\t2周后")
    for i, row in enumerate(data_matrix, 1):
        print(f"患者{i}\t{row[0]}\t{row[1]}\t{row[2]}")
    
    result = MultiSampleExactTests.page_test(data_matrix, alpha=0.05)
    
    print("\n检验结果:")
    print(f"L统计量: {result['L_statistic']:.4f}")
    print(f"标准化统计量: {result['z_statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"结论: {result['conclusion']}")

def example_durbin_test():
    """Durbin检验示例"""
    print("\n" + "="*50)
    print("Durbin 检验示例")
    print("="*50)
    
    # 示例：不完全区组设计中比较四种肥料的效果
    print("\n场景：不完全区组设计中比较四种肥料对作物产量的影响")
    print("数据：作物产量（公斤/亩），None表示该区组未使用该肥料")
    
    # 每行代表一个区组，每列代表一种肥料
    data_matrix = [
        [120, 135, None, 125],  # 区组1
        [None, 140, 130, 128],  # 区组2
        [118, None, 132, 126],  # 区组3
        [122, 138, 134, None],  # 区组4
        [119, 136, None, 127]   # 区组5
    ]
    
    print("产量数据（行=区组，列=肥料类型）:")
    print("区组\t肥料A\t肥料B\t肥料C\t肥料D")
    for i, row in enumerate(data_matrix, 1):
        row_str = [str(x) if x is not None else "--" for x in row]
        print(f"区组{i}\t{row_str[0]}\t{row_str[1]}\t{row_str[2]}\t{row_str[3]}")
    
    result = MultiSampleExactTests.durbin_test(data_matrix, alpha=0.05)
    
    print("\n检验结果:")
    print(f"D统计量: {result['D_statistic']:.4f}")
    print(f"p值: {result['p_value']:.4f}")
    print(f"各肥料使用次数: {result['treatment_counts']}")
    print(f"结论: {result['conclusion']}")

def example_auto_select():
    """自动选择检验方法示例"""
    print("\n" + "="*50)
    print("自动选择检验方法示例")
    print("="*50)
    
    # 示例1：独立样本，无序组别
    print("\n示例1：独立样本设计，无序组别")
    print("场景：比较三个不同地区的收入水平")
    
    region_a = [3500, 4200, 3800, 4500, 3900]
    region_b = [4800, 5200, 4600, 5000, 4700]
    region_c = [4100, 4400, 3900, 4300, 4000]
    
    data_groups = [region_a, region_b, region_c]
    
    result = MultiSampleExactTests.auto_select_test(
        data_groups=data_groups,
        design_type="independent",
        has_order=False
    )
    
    print(f"推荐方法: {result['recommendations'][0]['method']}")
    print(f"推荐理由: {result['recommendations'][0]['reason']}")
    print(f"检验结论: {result['recommendations'][0]['result']['conclusion']}")
    
    # 示例2：配对设计，有序处理
    print("\n示例2：配对设计，有序处理")
    print("场景：检验不同强度训练对体能的影响（低强度→中强度→高强度）")
    
    data_matrix = [
        [45, 52, 58],  # 受试者1
        [38, 44, 50],  # 受试者2
        [42, 48, 55],  # 受试者3
        [40, 46, 52]   # 受试者4
    ]
    
    result = MultiSampleExactTests.auto_select_test(
        data_matrix=data_matrix,
        design_type="paired",
        has_order=True
    )
    
    print(f"推荐方法数量: {result['total_recommendations']}")
    for i, rec in enumerate(result['recommendations'], 1):
        print(f"推荐{i}: {rec['method']}")
        print(f"理由: {rec['reason']}")
        print(f"检验结论: {rec['result']['conclusion']}")
        print()

def run_all_examples():
    """运行所有示例"""
    print("多样本位置检验 MCP 服务器使用示例")
    print("="*60)
    
    examples = [
        example_kruskal_wallis,
        example_jonckheere_terpstra,
        example_friedman,
        example_kendall_concordance,
        example_cochran_q,
        example_page_test,
        example_durbin_test,
        example_auto_select
    ]
    
    for example_func in examples:
        try:
            example_func()
        except Exception as e:
            print(f"\n示例 {example_func.__name__} 运行失败: {e}")
    
    print("\n" + "="*60)
    print("所有示例运行完成！")
    print("="*60)

if __name__ == "__main__":
    run_all_examples()